from django.conf import settings
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.generics import ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView
from random import randint
from django_redis import get_redis_connection
from itsdangerous import TimedJSONWebSignatureSerializer as TJS

from celery_tasks.sms_code.tasks import send_sms_code

from users.models import User
from users.serializers import UserSerializers, UserShowSerializers, UserEmailSerializers


# Create your views here.

# def send_sms_code(mobile, sms_code):
#     ccp = CCP()
#     ccp.send_template_sms(mobile, [sms_code, "5"], 1)


# 手机验证码视图类
class SMS_Code_View(APIView):

    # 一.获取数据
    # 1.获取前端传递的手机号
    # mobile 接受手机号
    def get(self, request, mobile):

        # 二.验证数据
        # 2.验证手机号格式   因为获取数据时有正则匹配,所以不需要再次验证

        # 创建连接对象,连接redis数据库
        conn = get_redis_connection("sms_code")
        #  获取一个标志数据
        flag = conn.get("sms_code_flag_%s"%mobile)
        # 通过标志数据判断是否达到60秒,如果没有就是频繁操作,报错
        if flag:
            return Response({"error":"请求过于频繁"},status=403)


        # 三.保存、更新、等实际业务
        # 3.生成短信验证码 导入随机模块
        sms_code = "%06d"%randint(0,999999)
        print(sms_code)

        # 管道
        pl = conn.pipeline()
        # 4.保存验证码 redis （缓存数据库）

        # 连接对象,写入到缓存数据库中,以string字符串的形式写入  通过redis官网查看如何写入
        pl.setex("sms_code_%s"%mobile,300,sms_code)
        # 写入一个标志数据
        pl.setex("sms_code_flag_%s"%mobile,60, 2)
        # 5.发送验证码
        # 将管道传递给redis
        pl.execute()

        # 导入云通讯模块
        # 创建云通讯对象
        # ccp = CCP()
        # # 调用云通讯方法,
        # # mobile发送给谁
        # # sms_code 发送的数据
        # # "5" 5分钟有效期
        # #
        #  发送的模板信息
        # # 耗时操作,需要进行异步处理(开辟线程, 单独执行发送短信的方法)
        # ccp.send_template_sms(mobile,[sms_code,"5"],1)
        # t=Thread(target=send_sms_code,kwargs={"mobile":mobile,"sms_code":sms_code})
        # t.start()

        # 使用celery
        send_sms_code.delay(mobile,sms_code)

        # 返回数据
        # 6.结果返回
        return Response("ok")

    # 判断用户名是否重复

# 判断用户名是否重复类
class UserNameView(APIView):

    def get(self,request,username):

        # 通过模型类查询username在不在数据库中
        count=User.objects.filter(username=username).count()
        return Response({
            "count":count
        })

    # 判断手机号是否重复

# 判断手机号是否重复视图类
class mobileView(APIView):
    def get(self, request, mobile):
        # 通过模型类查询mobile(手机号)在不在数据库中
        count = User.objects.filter(username=mobile).count()
        return Response({
            "count": count
        })


    # 注册用户


    # 指定序列化器

# 注册用户视图类
class UserView(CreateAPIView):
    serializer_class = UserSerializers

#   展示用户信息视图类
class UserShowView(RetrieveAPIView):
    # 指定序列化器

    serializer_class = UserShowSerializers
    queryset = User.objects.all()

    def get_object(self):
        # 重写get_object方法
        return self.request.user

# 用户邮箱保存(更新)视图类
class UserEmailView(UpdateAPIView):
    serializer_class = UserEmailSerializers


    # 重写get——object
    def get_object(self):
        return self.request.user

# 邮箱验证
class UserEmailVifyView(APIView):
    def get(self,request):

        # 1.获取前端数据 通过查询字符串的形式
        token = request.query_params.get('token')
        # 2.解密token
        tjs=TJS(settings.SECRET_KEY,300)
        try:
            data = tjs.loads(token)
        except:
            return Response({"errors":"错误的token"},status=400)
        # 3.获取解密后的token信息
        username = data.get("username")
        # 4.查询到信息后,根据信息查询用户对象
        user = User.objects.get(username=username)
        # 5.更新用户的邮箱验证状态
        user.email_active = True
        user.save()
        return Response({'email_active':user.email_active})

# 图片验证码视图类





